<?php
class servicio {
	/**
	 * Registra un usuario al sistema
	 * 
	 * @param string user
	 * @param string password
	 * 
	 * @return string
	 * 
	 */
	function registraUsuario($user, $password){
		require_once 'bootstrap.php';
		$conn = Doctrine_Manager::connection(DSN);
		$f = new usuario();
		$f->user = $user;
		$f->password = $password;
		$f->save();
		
		$q = Doctrine_Query::create()->from('usuario');
		$as = $q->fetchArray();
		
		return $q;
	}
	
	
	/**
	 * Realiza login de usuario, devuelve el token
	 * 
	 * @param string user
	 * @param string password
	 * 
	 * @return string
	 * 
	 */
	function login($user, $password){
		require_once 'bootstrap.php';
		$conn = Doctrine_Manager::connection(DSN);
		$q = Doctrine_Query::create()
		->select('id_user')
		->from('usuario')
		->where('user = ?',$user)
		->where('password = ?',$password);
		$usuarios = $q->execute();
		
		if(sizeof($usuarios) == 1){
			
			 $token = $this->generarToken(); 
			/*
			 * Si hay usuario, se crea el login
			 */
			 $f = new login();
			 $f->id_usuario = $usuarios[0]['id_user'];
		     $f->token = $token;
	
	
		     $f->fecha_login = strtotime("now");	     
		     $f->fecha_fin = strtotime("+30 minutes");
		    
			 $f->save();
			
			 return $token;
			
		} else {
			return "Error en login, o los datos son incorrectos";
		}
	}
	
	
	/**
	 * Comprueba validez de token
	 * 
	 * @param string token
	 * @return boolean
	 * 
	 */
	function comprobarLogin($token){
		require_once 'bootstrap.php';
		$conn = Doctrine_Manager::connection(DSN);
		$q = Doctrine_Query::create()
		->select('fecha_fin')
		->from('login')
		->where('token = ?',$token);
		$fecha_exp = "";
		$fecha_exp = $q->execute();
		$fecha_actual = strtotime("now");
		
		if($fecha_actual < $fecha_exp[0]['fecha_fin']){
			return true;
		} else {
			return false;
		}
		
	}
	
	/**
	 * Genera token aleatorio de 32 caracteres alfanumericos
	 * 
	 * @return string
	 * 
	 */
	function generarToken(){
		$caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; //posibles caracteres a usar
		$numerodeletras=32; //numero de letras para generar el texto
		$cadena = ""; //variable para almacenar la cadena generada
		
		for($i=0;$i<$numerodeletras;$i++)
		{
			$cadena .= substr($caracteres,rand(0,strlen($caracteres)),1); /*Extraemos 1 caracter de los caracteres 
			entre el rango 0 a Numero de letras que tiene la cadena */
		}
		return $cadena;
	}
	
	
	/**
	 * Encripta o desencripta textos, recibe texto entrada, texto salida y la accion
	 * 
	 * @param string entrada
	 * @param string accion
	 * @param string token
	 * 
	 * @return string
	 * 
	 */
	function encriptar($entrada, $accion, $token){
		require_once 'bootstrap.php';
		$conn = Doctrine_Manager::connection(DSN);
		$q = Doctrine_Query::create()
		->select('id_login')
		->from('login')
		->where('token = ?',$token)->execute();
		
		
		if($this->comprobarLogin($token)){
			if(!strcmp($accion, "encriptar")){
				$out = $this->encrypt($entrada);
				$f = new encriptacion();
				$f->id_login = $q[0]['id_login'];
				$f->entrada = $entrada;
				$f->salida = $out;
				$f->accion = "encriptar";
				$f->save();
				return $out;
			} else if(!strcmp($accion, "desencriptar")){
				$out = $this->decrypt($entrada);
				$f = new encriptacion();
				$f->id_login = $q[0]['id_login'];
				$f->entrada = $entrada;
				$f->salida = $out;
				$f->accion = "desencriptar";
				$f->save();
				return $out;
			}
			
		} else {
			return "sesion no valida, no se ha hecho ninguna accion";
		}
	}
	
	/**
	 * Retorna los textos encriptados por usuario en formato JSON
	 * 
	 * @param string token
	 * 
	 * @return string
	 */
	function mostrarEncriptados($token){
		
		if(!$this->comprobarLogin($token)){
			return "sesion no valida, no se ha hecho ninguna accion";
		}
		
		require_once 'bootstrap.php';
		$conn = Doctrine_Manager::connection(DSN);
		
		$q2 = Doctrine_Query::create()
		->select('id_usuario')
		->from('login')
		->where('token = ?',$token)->execute();
		
		$id_usuario = $q2[0]['id_usuario'];
		
		
		
		$q = Doctrine_Query::create()
		->select('id_encriptacion')
		->from('encriptacion e')
		->innerJoin('e.id_login l')
		->innerJoin('l.id_usuario u')
		->where('u.id_user = ?',$id_usuario)->execute();
		
		
		for($i = 0;$i < sizeof($q);$i++){
			$array[$i]['accion'] = $q[$i]['accion'];
			$array[$i]['entrada'] = $q[$i]['entrada'];
			$array[$i]['salida'] = $q[$i]['salida'];
		}
		
		return (json_encode($array));
		
		
			
	}
	
	
	
	function encrypt($string) {
		$string=str_replace("a","z",$string);
		$string=str_replace("b","y",$string);
		$string=str_replace("c","x",$string);
		$string=str_replace("d","w",$string);
		$string=str_replace("e","v",$string);
		$string=str_replace("f","u",$string);
		$string=str_replace("g","t",$string);
		$string=str_replace("h","s",$string);
		$string=str_replace("i","r",$string);
		$string=str_replace("j","q",$string);
		$string=str_replace("k","p",$string);
		$string=str_replace("m","n",$string);
		$string=str_replace("o","5",$string);
		return $string;
	}
	
	function decrypt($string) {
		$string=str_replace("z","a",$string);
		$string=str_replace("y","b",$string);
		$string=str_replace("x","c",$string);
		$string=str_replace("w","d",$string);
		$string=str_replace("v","e",$string);
		$string=str_replace("u","f",$string);
		$string=str_replace("t","g",$string);
		$string=str_replace("s","h",$string);
		$string=str_replace("r","i",$string);
		$string=str_replace("q","j",$string);
		$string=str_replace("p","k",$string);
		$string=str_replace("n","m",$string);
		$string=str_replace("5","o",$string);
		return $string;
	}
	
	

	
}
?>